#ifndef _M_LOG_H_
#define _M_LOG_H_

#include "ofc/ofc_types.h"
#include "m_log_backend_interface.h"

#ifdef __cplusplus
extern "C" {
#endif


/**
 * 自定义日志过滤规则判断
 * @param setting_level: 当前设置的日志级别
 * @param log: 日志数据
 * @return Ture:存储 False:丢弃
 */
typedef Bool (*TMLogDoFilter)(UInt8 setting_level, const TMLogData* log);

/**
 * 日志系统初始化(申请资源)
 * @return 初始化结果，参照THccMidMLogErrorEnum
 */
Int32 MLogInit(void);

/**
 * 日志系统去初始化(资源释放)
 * @return
 */
void MLogDone(void);

/**
 * 设置日志过滤级别. 默认级别 kMLogLevelTrace
 * @param level: 日志级别,级别参考TMLogLevelEnum
 * @note 严重等级高于等于该等级的日志均被存储
 * @return
 */
void MLogSetFilterLevel(UInt8 level);

/**
 * 获取当前日志设置过滤级别
 * @return  级别参考TMLogLevelEnum
 */
UInt8 MLogGetFilterLevel(void);

/**
 * 设置日志过滤回调函数
 * @param do_filter: 过滤回调函数
 * @note 设置过滤回调函数后，不使用级别过滤；设置为NULL，恢复使用级别过滤
 * @return
 */
void MLogSetFilterMethod(TMLogDoFilter do_filter);

/**
 * 开始采集
 * @return
 */
void MLogStart(void);

/**
 * 停止采集
 * @return
 */
void MLogStop(void);

/**
 * 强制写入
 * @return
 */
void MLogFlush(void);

/**
 * 日志写入
 * @param level: 日志级别,级别参考TMLogLevelEnum  3bit
 * @param module_id: 模块id   8bit
 * @param logId:  日志id      21bit
 * @param data:   数据指针
 * @param data_len:   数据长度 最大支持8个字节，不满足8个字节，存储以0填充
 * @return >=0:成功 <0:失败 参照THccMidMLogErrorEnum (hcc错误码网站可查)
 */
Int32 MLogWrite(UInt8 level, UInt8 module_id, UInt32 log_id, UInt8 *data, UInt8 data_len);

/**
 * UInt32类型日志写入
 * @param level         日志级别,级别参考TMLogLevelEnum  3bit
 * @param module_id     模块id   8bit
 * @param log_id        日志id   21bit
 * @param data1         日志数据1
 * @param data2         日志数据2
 * @return >=0:成功 <0:失败 参照THccMidMLogErrorEnum (hcc错误码网站可查)
 */
Int32 MLogWriteU32(UInt8 level, UInt8 module_id, UInt32 log_id, UInt32 data1, UInt32 data2);

/**
 * UInt64类型日志写入
 * @param level         日志级别,级别参考TMLogLevelEnum  3bit
 * @param module_id     模块id   8bit
 * @param log_id        日志id   21bit
 * @param data          日志数据. 低32位为data1, 高32位为data2
 * @return >=0:成功 <0:失败 参照THccMidMLogErrorEnum (hcc错误码网站可查)
 */
Int32 MLogWriteU64(UInt8 level, UInt8 module_id, UInt32 log_id, UInt64 data);

/**
 * 原始数据写入.(慎用)
 * @note 内部不自动获取日志时间. 使用场景: 通过xcu数据获取远端日志数据帧后, 直接写入本地系统, 可保持远端时间戳
 * @param log           完整的日志数据帧
 * @return >=0:成功 <0:失败 参照THccMidMLogErrorEnum (hcc错误码网站可查)
 */
Int32 MLogWriteData(const TMLogData* log);

/**
 * 注册日志输出实现
 * @param level: 过滤日志级别
 * @param log_interface: 后端接口的指针
 * @note 最大支持3个后端输出 不支持多线程调用
 * @return True: 成功; False: 失败
 */
Bool MLogRegisterOutput(UInt8 level, const IMLogBackend *log_interface);

/**
 * 卸载日志输出实现
 * @param log_interface: 后端接口的指针
 * @note  不支持多线程调用
 * @return
 */
void MLogUnregisterOutput(const IMLogBackend *log_interface);


/**
 * 分裂TMLogData::id得到对应信息
 * @param data_id           已知的TMLogData::id
 * @param *r_level          错误等级
 * @param *r_module_id      模块id
 * @param *r_log_id         日志id
 * @return 
 */
void MLogSplitDataId(UInt32 data_id, UInt8 *r_level, UInt8 *r_module_id, UInt32 *r_log_id);

#ifdef __cplusplus
} // extern "C" {
#endif
#endif 
